home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / C / Games / MacGnuGo 0.5e / gnugo.src / genmove.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-10-27  |  2.4 KB  |  104 lines  |  [TEXT/R*ch]

  1. #include "comment.header"
  2.   
  3. #define EMPTY 0
  4. #define BLACKSTONE 2
  5.  
  6. extern unsigned char p[19][19];
  7. extern int currentStone, opposingStone, MAXX, MAXY;
  8. extern int rd, lib, blackPassed, whitePassed;
  9. extern int selpat,selv;
  10. extern int randomize_flag;
  11. int atari;
  12. extern void eval(int);
  13. extern void markt(),genfield();
  14. extern int fiot(int,int,int);
  15. extern int findwinner(int*,int*,int*);
  16. extern int findsaver(int*,int*,int*);
  17. extern int findpatn(int*,int*,int*);
  18. extern void countlib(int,int,int);
  19. extern int fioe(int,int);
  20. extern void uRandom(int*);
  21. extern int findfmove(int*,int*);
  22. extern int checkatari(int,int);
  23. extern int randmove(int*,int*,int);
  24.  
  25. void genmove(int *i, int *j)
  26.      /* generate computer move */
  27. {
  28.   int ti, tj, tval;
  29.   int val;
  30.   
  31.   if (randomize_flag) { randmove(i,j,currentStone); return; }
  32.   
  33.   /* initialize move and value */
  34.   *i = -1;  *j = -1;  val = -1; tval = -1; selpat = -1; selv = -1;
  35.   
  36.   /* re-evaluate liberty of opponent pieces */
  37.   eval(opposingStone);
  38.   eval(currentStone);
  39.  
  40.   /* mark surrounded territory */
  41.   markt(); genfield();
  42.   atari = 0;
  43.   
  44.   /* find opponent piece to capture or attack */
  45.   if (findwinner(&ti, &tj, &tval))
  46.     if (tval > val)
  47.       {
  48.     val = tval; selpat = 3000 + tval;
  49.     *i = ti;
  50.     *j = tj;
  51.       }
  52.   
  53.   /* save any piece if threaten */
  54.   if (findsaver(&ti, &tj, &tval))
  55.     if (tval >= val)
  56.       {
  57.     val = tval; selpat = 2000 + tval;
  58.     *i = ti;
  59.     *j = tj;
  60.       }
  61.   
  62.   /* try match local play pattern for new move */
  63.   if (findpatn(&ti, &tj, &tval))
  64.     if (tval > val && fiot(ti, tj, 3) == 0)
  65.       {
  66.     val = tval;
  67.     *i = ti;
  68.     *j = tj;
  69.       }
  70.   
  71.   /* no urgent move then do random move */
  72.   if (val < 0) {
  73.       if (selpat = findfmove(&ti, &tj)) { *i = ti; *j = tj; }
  74.       if (selpat <= 0 && findsplitter(&ti, &tj)) { *i = ti; *j = tj; }
  75.       lib = 0;
  76.       if (*i >= 0) countlib(*i, *j, currentStone);
  77.       if ( (p[*i][*j] != EMPTY) || (lib < 2) || *i < 0 ||
  78.            fioe(*i, *j) ) { *i = *j = -1; }
  79.       /* avoid illegal move, liberty one or suicide, fill in own eye */
  80.   }
  81.  
  82.   if (*i < 0) {
  83.       if (currentStone == BLACKSTONE)
  84.     blackPassed = 1;
  85.       else
  86.     whitePassed = 1;
  87.       *i = *j = -1;            /* computer pass */
  88.   }
  89.   else   /* find valid move */
  90.   {
  91.       if (currentStone == BLACKSTONE)
  92.     blackPassed = 0;
  93.       else
  94.     whitePassed = 0;
  95.       eval(opposingStone);
  96.       checkatari(*i,*j);
  97.   }   
  98.  
  99. #ifdef debug
  100.   printf("selpat = %d, %d\n",selpat, selv);
  101. #endif
  102. }
  103. /* end genmove */
  104.